package com.darwin.darwinUI.manager
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.InteractiveObject;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.events.MouseEvent;
	import flash.ui.Mouse;
	import flash.ui.MouseCursor;
	
	/**
	 * 
	 * 鼠标样式管理器.初始请设置 parent 属性
	 * @author lipi
	 */
	public class MouseManager extends EventDispatcher
	{
		public function MouseManager(target:IEventDispatcher=null)
		{
			super(target);
			
			_stage = UIStage.uiStage;
			_stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);
		}
		
		private var _stage:Stage;
		
		private var _parent:DisplayObjectContainer;
		/**
		 * 鼠标显示对象所在的父容器
		 * @return 
		 */
		public function get parent():DisplayObjectContainer
		{
			return _parent || _stage;
		}
		
		public function set parent(value:DisplayObjectContainer):void
		{
			_parent = value;
		}
		
		private var _update:Boolean = false;
		/**
		 * 鼠标移动是否即时渲染
		 * @return Boolean
		 */
		public function get update():Boolean
		{
			return _update;
		}
		
		public function set update(value:Boolean):void
		{
			_update = value;
		}
		
		
		
		private var _preCursor:DisplayObject;
		private var _currentCursor:DisplayObject;
		
		//设置当前鼠标样式
		private function _setCurrentCursor(v:DisplayObject):void
		{
			if(v == _currentCursor) return;
			
			if(v is DisplayObjectContainer) (v as DisplayObjectContainer).mouseChildren = false;
			if(v is InteractiveObject) (v as InteractiveObject).mouseEnabled = false;
			
			if(_currentCursor && parent.contains(_currentCursor))
			{
				parent.removeChild(_currentCursor);
				_currentCursor = null;
			}
			if(v)
			{
				_currentCursor = v;
				parent.addChild(_currentCursor);
				mouseMoveHandler();
			}
//			if(_currentCursor) hideCursor();
//			else showCursor();
		}
		
		
		/**
		 * 返回当前样式
		 * @return 
		 */
		public function getCurrentCursor():DisplayObject
		{
			return _currentCursor;
		}
		
//		private var _hideingCursor:String;
//		private function hideCursor():void
//		{
//			if(_hideingCursor) return;
//			_hideingCursor = Mouse.cursor;
//			Mouse.cursor = MouseCursor.AUTO;
//			Mouse.hide();
//			
//		}
//		private function showCursor():void
//		{
//			if(_hideingCursor)
//			{
//				Mouse.show();
//				Mouse.cursor = _hideingCursor;
//				_hideingCursor = null;
//			}
//		}
		
		private var _offsetX:Number = 0;

		public function get offsetX():Number
		{
			return _offsetX;
		}

		public function set offsetX(value:Number):void
		{
			_offsetX = value;
		}

		private var _offsetY:Number = 0;

		public function get offsetY():Number
		{
			return _offsetY;
		}

		public function set offsetY(value:Number):void
		{
			_offsetY = value;
		}
		
		
		/**
		 * 设置光标样式
		 * 如果lock被标记为 true,将不能再更改鼠标样式，除非手动调用unlock
		 * @param v 光标类型，如果需要在鼠标按时对其处理，请实现ICursor接口
		 * @param lock 是否锁定这个光标不让其它地方进行更改
		 */
		public function setCursor(v:DisplayObject,lock:Boolean = false,offsetX:Number = 0,offsetY:Number = 0):void
		{
			if(_lock == false || lock == true)
			{
				_setCurrentCursor(v);
				_lock = lock;
				this.offsetX = offsetX;
				this.offsetY = offsetY;
			}
			
		}
		
		
		/**
		 * 移除一个光标样式
		 * @param v 光标显示对象
		 * @param back 是否退回到上一个光标(如果有)
		 * 
		 */
		public function removeCursor(v:DisplayObject=null,back:Boolean = false):void
		{
			if(v == null) v = _currentCursor;
			if(_currentCursor == v)
			{
				unlock();
				if(back)
				{
					setCursor(_preCursor);
				}else{
					setCursor(null);
					_preCursor = null;
				}
			}
		}
		
		/**
		 * 解除对当前鼠标的锁定
		 */
		public function unlock():void
		{
			_lock = false;
		}
		
		//锁，如果_lock被标记为 true,将不能再更改鼠标样式
		private var _lock:Boolean = false;
		
//		//默认的光标光标
//		private var _defaultCursor:DisplayObject;
//		
//		//可点击区域鼠标移上的光标
//		private var _buttonOverCursor:DisplayObject;
		
		
//		/**
//		 * 默认的光标对象
//		 * @param v 光标显示对象
//		 */
//		public function set defaultCursor(v:DisplayObject):void
//		{
//			_defaultCursor = v;
//			if(_currentCursor == null)
//			{
//				setCursor(_defaultCursor);
//			}
//		}
//		
//		/**
//		 * 设置可点击区域鼠标移上的光标样式
//		 * @param v
//		 */
//		public function set buttonOverCursor(v:DisplayObject):void
//		{
//			_buttonOverCursor = v;
//		}
		
		
		//鼠标移动处理
		private function mouseMoveHandler(e:MouseEvent = null):void
		{
			if(_currentCursor)
			{
				_currentCursor.x = _stage.mouseX + offsetX;
				_currentCursor.y = _stage.mouseY + offsetY;
			}
			
			if(update) e.updateAfterEvent();
		}
	}
}